package br.eng.eliseu.gwt.gestaoWeb.client.ui.site.cadastro;

import java.util.List;

import br.eng.eliseu.gwt.gestaoWeb.client.event.LoginEvent;
import br.eng.eliseu.gwt.gestaoWeb.client.mvp.PortalResource;
import br.eng.eliseu.gwt.gestaoWeb.client.mvp.presenter.BasePresenter;
import br.eng.eliseu.gwt.gestaoWeb.client.mvp.view.BaseDisplay;
import br.eng.eliseu.gwt.gestaoWeb.client.service.CadastroService;
import br.eng.eliseu.gwt.gestaoWeb.client.service.CadastroServiceAsync;
import br.eng.eliseu.gwt.gestaoWeb.client.service.LoginService;
import br.eng.eliseu.gwt.gestaoWeb.client.service.LoginServiceAsync;
import br.eng.eliseu.gwt.gestaoWeb.client.ui.component.messageBox.MessageBoxPanel;
import br.eng.eliseu.gwt.gestaoWeb.model.UsuarioAutenticadoVO;
import br.eng.eliseu.gwt.gestaoWeb.model.empresa.Empresa;
import br.eng.eliseu.gwt.gestaoWeb.model.usuario.Usuario;
import br.eng.eliseu.gwt.gestaoWeb.model.usuario.UsuarioSistema;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class PrimeiroCadastroPresenter extends BasePresenter{

//	private List<Pais> listaPais;
//	private List<Estado> listaEstados;
//	private List<TipoLogradouro> listaTiposLogradouro;
	
	public interface Display extends BaseDisplay {
		public HasClickHandlers getProximoPassoButton();
		public HasClickHandlers getVoltarButton();
		public HasClickHandlers getTerminaButton();
		public void showPasso( Integer passo );
		public Boolean checaCampoEmBrancoPasso1();
		public Boolean checaCampoEmBrancoPasso2();
		public MessageBoxPanel getMsgPanel();
		public PrimeiroCadastroViewVO getPrimeiroCadastroVO(); 
		public void carregaVO();
	}

	private final Display display;
	private final PortalResource recursos;
	
	private CadastroServiceAsync cadastroService = GWT.create(CadastroService.class);
	private LoginServiceAsync loginService = GWT.create(LoginService.class);
	
	public PrimeiroCadastroPresenter(Display display, PortalResource recursos ) {
		this.display = display;
		this.recursos = recursos;
		bind();
	}


	public void bind() {
		// --- Evendo do click do botao ProximoPassoButton
	    getDisplay().getProximoPassoButton().addClickHandler(new ClickHandler() {   
	        public void onClick(ClickEvent event) {
	        	getDisplay().getMsgPanel().clear();
	        	if (getDisplay().checaCampoEmBrancoPasso1()){
	        		getDisplay().carregaVO();
					getDisplay().getMsgPanel().clear();
	        		pegaEmpresaAsync(getDisplay().getPrimeiroCadastroVO().getDocEmpresa());
	        	}
	        	getDisplay().getMsgPanel().showMsg(true, true);
	        }

	      });

		// --- Evendo do click do botao VoltarButton
	    getDisplay().getVoltarButton().addClickHandler(new ClickHandler() {   
	        public void onClick(ClickEvent event) {
	        	getDisplay().showPasso(1);
	        }
	      });

		// --- Evendo do click do botao TerminaButton
	    getDisplay().getTerminaButton().addClickHandler(new ClickHandler() {   
	        public void onClick(ClickEvent event) {
	        	getDisplay().getMsgPanel().clear();
	        	if (getDisplay().checaCampoEmBrancoPasso2()){
	        		getDisplay().carregaVO();
	        		salvaAsync();
	        	}
	        	getDisplay().getMsgPanel().showMsg(true, true);
	        }
	      });

	}
	public void go() {
	}
	
	public PortalResource getRecursos() {
		return recursos;
	}
	public Display getDisplay() {
		return display;
	}

	public void salvaAsync(){
		cadastroService.salvaCadastroGratis( getDisplay().getPrimeiroCadastroVO(), new AsyncCallback<UsuarioAutenticadoVO>() {

			public void onFailure(Throwable arg0) {
			}

			public void onSuccess(UsuarioAutenticadoVO usr) {

				loginService.autenticaUsuario(
						usr.getUsuarioAutenticado().getEmpresaSistema().getEmpresa(), 
						usr.getUsuarioAutenticado().getEmpresaSistema().getSistema(), 
						usr.getUsuarioAutenticado().getUsuario(), 
						new AsyncCallback<UsuarioAutenticadoVO>(){

					public void onFailure(Throwable arg0) {
						getDisplay().getMsgPanel().addMsg("Nao foi possivel autenticar este usuario");
						getDisplay().getMsgPanel().showMsg(true, true);
					}

					public void onSuccess(UsuarioAutenticadoVO usrAutenticado) {
						// --- Envio um evento LoginEvent para quem interecar
						LoginEvent event = new LoginEvent();
						event.setUsuarioVO(usrAutenticado);
						getRecursos().getEventBus().fireEvent(event);
					}});
			}
		});

	}
	
	public void pegaEmpresaAsync(String docEmpresa) {
		if (docEmpresa!=null && !"".equals(docEmpresa)){
			cadastroService.getEmpresa( docEmpresa, new AsyncCallback<Empresa>() {
	
				public void onFailure(Throwable erro) {
					/* Se falhou na busca da empresa é porque a empresa nao existe.
					 * entao continuo com a validacao do cadastro
					 */
					loginService.autenticaUsuario( 
							getDisplay().getPrimeiroCadastroVO().getUsuario(), 
							new AsyncCallback<Usuario>(){

								public void onFailure(Throwable erro) {
									/* Se retornar erro é porque o usuario nao esta cadastrado
									 * neste caso eu continuo o cadastro
									 */
									getDisplay().showPasso(2);									
								}

								public void onSuccess(Usuario arg0) {
									loginService.autenticaUsuario( 
											getDisplay().getPrimeiroCadastroVO().getUsuario(), 
											getDisplay().getPrimeiroCadastroVO().getSenha(),
											new AsyncCallback<List<UsuarioSistema>>(){
												
												public void onFailure(Throwable erro) {
													getDisplay().getMsgPanel().addMsg(erro.getMessage());
													getDisplay().getMsgPanel().showMsg(true, true);
												}
												
												public void onSuccess(List<UsuarioSistema> arg0) {
													getDisplay().showPasso(2);
												}
											}
											);
								}
								
							}
					);

				}
	
				public void onSuccess(Empresa empresa) {
					/* Se achou a empresa entao ela nao podera ser cadastrada novamente
					 */
					getDisplay().getMsgPanel().addMsg("Esta Empresa já esta cadastrada!!");
					getDisplay().getMsgPanel().showMsg(true, true);
				}
			});
		
		}
		
		
	}
	
	

}
